package ch06.verlet
{
	import flash.display.Graphics;

	public class VerletStick
	{
		private var _pointA:VerletPoint;
		private var _pointB:VerletPoint;
		private var _length:Number;

		public function VerletStick(pointA:VerletPoint, pointB:VerletPoint, length:Number = -1)
		{
			_pointA = pointA;
			_pointB = pointB;
			if (length == -1)
			{
				var dx:Number = _pointA.x - _pointB.x;
				var dy:Number = _pointA.y - _pointB.y;
				_length = Math.sqrt(dx * dx + dy * dy);
			}
			else
			{
				_length = length;
			}
		}

		public function update():void
		{
			//首先通过两点间距离公式算出线段当前的长度，再减去之前的长度得到差量。
			var dx:Number = _pointB.x - _pointA.x;
			var dy:Number = _pointB.y - _pointA.y;
			var dist:Number = Math.sqrt(dx * dx + dy * dy);
			var diff:Number = _length - dist;
			//接下来可以通过三角函数求出差量在 x、y 上的分量。还记得 cos 等于临边/斜边，sin等于对边/斜边.
			/*
			   注意，实际代码中我们把结果除以 2，然后两个点各自加减结果的一半。也就是，第一
			   个点减去x、y 偏移量的一半，第二个点加上x、y 偏移量的一半。这样做
			   让两个点都有反应，并保证之间的距离和length 一致。
			 */
			var offsetX:Number = (diff * dx / dist) / 2;
			var offsetY:Number = (diff * dy / dist) / 2;
			_pointA.x -= offsetX;
			_pointA.y -= offsetY;
			_pointB.x += offsetX;
			_pointB.y += offsetY;
		}

		public function render(g:Graphics):void
		{
			g.lineStyle(0);
			g.moveTo(_pointA.x, _pointA.y);
			g.lineTo(_pointB.x, _pointB.y);
		}
	}
}